{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#Logistic回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#导入必要的工具包\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "\n",
    "#评价指标用logloss\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148.0</td>\n",
       "      <td>72.0</td>\n",
       "      <td>35.00000</td>\n",
       "      <td>155.548223</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>29.00000</td>\n",
       "      <td>155.548223</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183.0</td>\n",
       "      <td>64.0</td>\n",
       "      <td>29.15342</td>\n",
       "      <td>155.548223</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89.0</td>\n",
       "      <td>66.0</td>\n",
       "      <td>23.00000</td>\n",
       "      <td>94.000000</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137.0</td>\n",
       "      <td>40.0</td>\n",
       "      <td>35.00000</td>\n",
       "      <td>168.000000</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness     Insulin   BMI  \\\n",
       "0            6    148.0           72.0       35.00000  155.548223  33.6   \n",
       "1            1     85.0           66.0       29.00000  155.548223  26.6   \n",
       "2            8    183.0           64.0       29.15342  155.548223  23.3   \n",
       "3            1     89.0           66.0       23.00000   94.000000  28.1   \n",
       "4            0    137.0           40.0       35.00000  168.000000  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#把数据读进来\n",
    "train = pd.read_csv(\"FE_diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null float64\n",
      "BloodPressure               768 non-null float64\n",
      "SkinThickness               768 non-null float64\n",
      "Insulin                     768 non-null float64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(6), int64(3)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#设置输入的X值和输出的Y值\n",
    "y_train = train ['Outcome']\n",
    "x_train = train.drop([\"Outcome\"],axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#对数据进行标准化处理\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "ss_x = StandardScaler()\n",
    "\n",
    "x_train = ss_x.fit_transform(x_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "#用Logistic进行模型的训练\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "lr = LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is : [0.48764798 0.53308944 0.45555656 0.421842   0.48459056]\n",
      "cv logloss is : 0.4765453078234202\n"
     ]
    }
   ],
   "source": [
    "#使用交叉验证,采用5个副本的模式进行交叉验证（因为作业要求20%的数据作为测试集）\n",
    "from sklearn.model_selection import cross_val_score\n",
    "loss = cross_val_score(lr, x_train, y_train, cv = 5, scoring = 'neg_log_loss' )\n",
    "print (\"logloss of each fold is :\",-loss )\n",
    "print (\"cv logloss is :\",-loss.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.01, 0.1, 0.2, 0.22, 0.24, 0.26, 0.28, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 10]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 正则化的 LogisticsRegressionCV和GridSearchCV以及参数调优\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数有C和正则项\n",
    "\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [ 0.01, 0.1, 0.2, 0.22, 0.24, 0.26, 0.28, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1,10]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "\n",
    "lr_penalty = LogisticRegression()\n",
    "grid = GridSearchCV(lr_penalty, tuned_parameters , cv = 5, scoring= 'neg_log_loss')\n",
    "grid.fit(x_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.47567714731290067\n",
      "{'C': 0.28, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "#查看选择的最优参数的C和正则项\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\AI\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\AI\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#以图形的方式来观察参数变化时\n",
    "test_means = -grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = -grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = -grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = -grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr = test_stds[:,i])\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr = train_stds[:,i])\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )\n",
    "pyplot.ylabel( 'logloss' )\n",
    "pyplot.savefig( 'LogisticGridSearchCV_C.png' )\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.05, 0.1, 0.15, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#按正确率作为指标\n",
    "# 正则化的 LogisticsRegressionCV和GridSearchCV以及参数调优\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数有C和正则项,默认的参考指标即为正确率。\n",
    "\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [ 0.001, 0.01, 0.05, 0.1 ,0.15, 1, 10, 100, 1000 ]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "\n",
    "lr_penalty = LogisticRegression()\n",
    "grid = GridSearchCV(lr_penalty, tuned_parameters , cv = 5)\n",
    "grid.fit(x_train,y_train)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7760416666666666\n",
      "{'C': 0.1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "print(grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\AI\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\AI\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#以图形的方式来观察参数变化时\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    pyplot.errorbar(x_axis, test_scores[:,i], yerr = test_stds[:,i])\n",
    "    pyplot.errorbar(x_axis, train_scores[:,i], yerr = train_stds[:,i])\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )\n",
    "pyplot.ylabel( 'aocuary' )\n",
    "pyplot.savefig( 'LogisticGridSearchCV_C.png' )\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
